cmake_minimum_required(VERSION 3.1)

#让CMake在构建时使用MinGW的编译器
set(CMAKE_C_COMPILER "C:/Program Files/mingw64/bin/gcc.exe")
set(CMAKE_CXX_COMPILER "C:/Program Files/mingw64/bin/g++.exe")  

#设置编译器属性
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)   	# 强制要求编译器支持 C++11
set(CMAKE_CXX_EXTENSIONS OFF)         	# 禁用编译器扩展（如 GNU 扩展）

# 设置 DLL 导出宏
#add_definitions(-DMYLIB_EXPORTS)

#指定项目名称
project(subProj LANGUAGES CXX)

#设置编译动态库功能开
set(BUILD_SHARED_LIBS on)

#设置生成的库的输出目录
#set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG  	"${CMAKE_BINARY_DIR}/../../subProjTargetLib/Debug")		    #只对.dll文件起作用
#set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE  "${CMAKE_BINARY_DIR}/../../subProjTargetLib/Release")
#set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG  	"${CMAKE_BINARY_DIR}/../../subProjTargetLib/Debug")		#只对.dll.a或.lib文件起作用
#set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE  "${CMAKE_BINARY_DIR}/../../subProjTargetLib/Release")

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG  	"D:/testSubCmake/projTargetPath/Debug")		    #只对.dll文件起作用
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE  "D:/testSubCmake/projTargetPath/Release")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG  	"D:/testSubCmake/projTargetPath/Debug")		#只对.dll.a或.lib文件起作用
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE  "D:/testSubCmake/projTargetPath/Release")

# 设置默认构建类型，如果没通过命令 cmake --build build --config Release 指定
# 用VS Code打开后构建可能还是Debug版本，因为构建类型由 VS Code 的构建任务决定，需要 VS Code 的命令面板（Ctrl+Shift+P），搜索并选择 CMake: Select Variant，选择Release
if(NOT CMAKE_BUILD_TYPE)
    #set(CMAKE_BUILD_TYPE Debug)  # 默认为 Debug
    set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)  # 构建Release
endif()

#指定头文件搜索路径，全局的，所有目标都会继承。改用target_include_directories命令，放在后面
#include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)  

#添加源文件
aux_source_directory("${CMAKE_CURRENT_SOURCE_DIR}/src/" SRC_LIST)
aux_source_directory("${CMAKE_CURRENT_SOURCE_DIR}/classSrc/" SRC_CLASS)

# 添加 DLL 目标
add_library(subProj SHARED ${SRC_LIST} ${SRC_CLASS})
#add_executable(subProj main.cpp ${SRC_LIST} ${SRC_CLASS})

# 定义导出宏（用于区分编译/链接阶段），仅限本项目使用的私有宏
target_compile_definitions(subProj PRIVATE MYLIB_EXPORTS)

# 公开此项目的头文件目录，供主项目包含，必须放在add_executable()或add_library()后面
# PUBLIC既用于当前目标也传递给依赖他的其它目标；PRIVATE仅用于当前目标不传给其它目标，INTERFACE不用于当前目标仅传递给其它目标
target_include_directories(subProj PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)

# 复制库文件到指定目录，确保包含此库工程的主工程目标在与运行时能找到。只拷贝dll文件，运行时只需dll文件
set(DEBUG_COPY_DIR "D:/testSubCmake/mainApp/bin/debug")
set(RELEASE_COPY_DIR "D:/testSubCmake/mainApp/bin/release")
add_custom_command(TARGET subProj POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy
        $<TARGET_FILE:subProj> 
        "$<$<CONFIG:Debug>:${DEBUG_COPY_DIR}>$<$<CONFIG:Release>:${RELEASE_COPY_DIR}>/$<TARGET_FILE_NAME:subProj>"
    COMMENT "Copying library to output directory"
)

#指定头文件搜索路径     此工程可能不使用，供链接此库的主工程使用，要使用PUBLIC传递
target_include_directories(subProj PUBLIC D:/testSubCmake/sqlite/include)  

#关联动态库-- 目录+库   此工程可能不使用该动态库，供链接此库的主工程链接使用，要使用PUBLIC传递
if (CMAKE_BUILD_TYPE AND (CMAKE_BUILD_TYPE STREQUAL "Release"))
    target_link_directories(subProj PUBLIC D:/testSubCmake/sqlite/bin/Release)  #路径有空格时最好加引号
else ()
    target_link_directories(subProj PUBLIC D:/testSubCmake/sqlite/bin/Debug)  #路径有空格时最好加引号
endif ()
target_link_libraries(subProj PUBLIC libsqlite3.dll.a)